using namespace std;


// version 1


// function 1
class Solution {
public:

    bool isHappy(int n) {
       if(n == 1) return true;
       long long Square_sum = 0;
       //拆数位
       while(n != 1){
        // 这里直接通过检测 -> 得到停止条件
           if((n >= 2 && n <= 6) || (n >= 8 && n <= 9))
                return false;
           //else if(n == 7) return true;

           while(n){
               int LowNum = n % 10;
               Square_sum += (LowNum * LowNum);
               n /= 10; 
            }
            
            n = Square_sum;
            Square_sum = 0; 
        }
       return true;
    }
};



// function 2
class Solution {
public:
    int GetSquare_sum(int n){
        int Square_sum = 0;
        while(n){
            int num = n % 10;
            Square_sum += num * num;
            n /= 10;
        }
        return Square_sum;
    }

    bool isHappy(int n) {
        int fast = n, slow = n;
        bool start = true;
        while(fast != slow || start){
            fast = GetSquare_sum(fast);
            fast = GetSquare_sum(fast);
            slow = GetSquare_sum(slow);
            if(start) start = false;
        }
        // fast 和 slow 总会相遇  ->  即fast == slow
        return fast == 1;  
    }
};

//这里需要注意的一点就是：
//一进来fast == slow的！
//所以while(fast != slow)肯定是不行的！ 就没办法进来了！
//所以，需要加入一个标记为start。如果是一开始(fast == slow) ，但是也是要进来的，所以需要 || 运算start
//但是，后序的逻辑控制仅取决于fast 是否等于 slow，所以，start就不能再生效，所以，就内部强制赋值为false